import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:getx_controller_lifecycle/home_page.dart';
import 'no_put_controller1.dart';
import 'no_put_controller2.dart';

/// 1、.obs Obx() 这种方式不需要调用Get.put, 原因：obs的方式，Get帮我们构造StremBuilder,这个并不依赖Get底层维护的Map字典
/// 2、GetBuilder在使用前需要调用Get.put，GetBuilder构造StatefulWidget在build的时候会通过GetInstance.find查找_singl这个map，没有调用put会查找不到
/// 此案例中controller1为obs方式，并没有调用Get.put，使用正常
/// 此案例中controller2为GetBuilder方式，如果没有调用Get.put的话，则报错
/// 3、调用完Get.put()且所在Widget加入Widget树后，才会有onInit，onClose的生命周期函数回调
/// 此案例中controller1没有调用Get.put，onInit和onClose没有执行，而controller2则有执行
///
/// 补充：controller的销毁存在延迟的问题，本案例中，改变controller2的counter，
///      快速退出页面再点击进入，偶尔会出现controller2没有被销毁的情况

class NoPutPage extends StatelessWidget {
  NoPutPage({super.key});

  final NoPutController2 controller2 = Get.put(NoPutController2());

  _addCount1() {
    NoPutController1.shared.counter += 1;
  }

  _addCount2() {
    controller2.counter += 1;
  }

  @override
  Widget build(BuildContext context) {
    PageAction action = Get.arguments;
    return Scaffold(
      appBar: AppBar(
        title: Text(
          action.name,
          style: const TextStyle(
            fontSize: 14
          ),
        ),
      ),
      backgroundColor: Colors.white,
      body: SingleChildScrollView(
        child: Column(
          children: [
            const Padding(
              padding: EdgeInsets.all(15),
              child: Text(
                """
GetxController不是必须调用Get.put才能使用的：
1、.obs Obx() 这种方式不需要调用Get.put, 原因：obs的方式，Get帮我们构造StremBuilder,这个并不依赖Get底层维护的Map字典
2、GetBuilder在使用前需要调用Get.put，GetBuilder构造StatefulWidget在build的时候会通过GetInstance.find查找_singl这个map，没有调用put会找不到controller
3、调用完Get.put()且所在Widget加入Widget树后，才会有onInit，onClose的生命周期函数回调
              """,
                maxLines: 100,
                style: TextStyle(
                  fontSize: 15,
                ),
                strutStyle: StrutStyle(
                    leading: 0
                ),
              ),
            ),
            Column(
              mainAxisAlignment: MainAxisAlignment.center,
              crossAxisAlignment: CrossAxisAlignment.center,
              children: [
                ///Obx的controller不需要调用Get.put
                Obx(() => Text(
                    "count1:${NoPutController1.shared.counter}"
                )),
                ///GetBuilder的controller需要先调用Get.put,否则会报错
                GetBuilder<NoPutController2>(builder: (controller){
                  return Text(
                      "count2:${controller.counter}"
                  );
                }),
                const SizedBox(height: 15,),
                ElevatedButton(
                    onPressed: _addCount1,
                    child: const Text("count1 + 1")
                ),
                ElevatedButton(
                    onPressed: _addCount2,
                    child: const Text("count2 + 1")
                )
              ],
            ),
          ],
        ),
      )
    );
  }
}
